package socket;

import java.io.*;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;

/**
 * 聊天客户端
 *
 * 连接3次握手
 * 断开4次挥手
 */
public class Client {
    /*
    java.net.Socket 套接字
    它封装了TCP协议的通讯细节，使用它要把和服务端建立连接并进行交互
     */
    private Socket socket;
    public Client(){
        try {
            System.out.println("正在连接服务端");
            /*
            实例化Socket对象，就是与远端计算机建立连接的过程
            这里需要传入两个参数
            1.服务端的Ip地址，用于找到网络上对方的计算机
            2.服务端口，用于找到服务端计算机的服务端应用程序

            查看IP的操作
            win+r 输入ipconfig查看ip地址
             */
            socket =new Socket("localhost",9089);//ip地址和端口号 进行三次握手
            System.out.println("服务端连接成功");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /** 该方法用于启动客户端程序的执行 */
    public void start(){
        try {
            /*
            Socket提供了一个重要的方法
            OutputStream getOutputStream()
            通过socket获取输出流将写出的信息发生到服务端
            这个输出流的作用是，允许客户端程序往这个流里写入数据，而这些写入的数据会通过 Socket 所建立的网络连接，
            发送到与之连接的服务器端 。简单说，就是客户端借助这个输出流，把要传递给服务器的数据 “装进去”，
            然后数据就会顺着网络通道 “流” 到服务器那里。
             */
            OutputStream out =socket.getOutputStream();
            OutputStreamWriter osw =new OutputStreamWriter(out, StandardCharsets.UTF_8);
            BufferedWriter bw =new BufferedWriter(osw);
            PrintWriter pw =new PrintWriter(bw,true);//自动行刷新
//            pw.println("你好服务器");

            Scanner scan =new Scanner(System.in);
            System.out.println("请开始输入内容,单独输入exit时退出");
            while(true){
                String line =scan.nextLine();
                if("exit".equalsIgnoreCase(line)){
                    break;
                }
                
                pw.println(line);//发生数据到服务器
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                socket.close();//进行了四次挥手
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }

    public static void main(String[] args) {
        Client client =new Client();
        client.start();
    }
}
